﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms;
using System.Windows.Forms.Integration;
using System.Windows.Input;
using System.Windows.Media;
using System.Diagnostics;
using Newtonsoft.Json;
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
using Microsoft.Office.Interop.Excel;
using Microsoft.Vbe.Interop;
using QMagicBoxExcel.Properties;
using UserControl = System.Windows.Controls.UserControl;
using Button = System.Windows.Controls.Button;
using Application = Microsoft.Office.Interop.Excel.Application;
using KeyEventArgs = System.Windows.Input.KeyEventArgs;
using MessageBox = System.Windows.MessageBox;
using Action = System.Action;
using System.Threading.Tasks;

namespace QMagicBoxExcel
{
    public partial class AIChatUserControl : UserControl
    {
        // 定义事件
        public event EventHandler PopOutRequested;
        public event EventHandler PopBackRequested;

        // 保存原始宿主引用
        public ElementHost OriginalHost { get; set; }

        // 标记是否处于弹出窗口状态
        public bool IsInPopOutWindow = false;

        // 定义控件和变量
        private Button SettingsButton;
        private WebView2 webView; // WebView2 控件
        private Application App;
        private List<VbaCodeItem> vbaCodeItems = new List<VbaCodeItem>(); // VBA代码列表
        private string vbaCodeFilePath; // VBA代码存储文件路径

        // 定义常量
        private const string DefaultVbaFileName = "ExcelvbaCodes.json";
        private const string WebView2DataFolder = "快捷魔方wd";
        private const string DefaultWebPageUrl = "https://www.deepseek.com";

        // 定义颜色常量
        private static readonly SolidColorBrush DefaultButtonBackground = new SolidColorBrush(Color.FromArgb(255, 238, 242, 250)); // #FFEEF2FA
        private static readonly SolidColorBrush DefaultButtonForeground = new SolidColorBrush(Color.FromArgb(255, 37, 99, 235));   // #FF2563EB
        private static readonly SolidColorBrush ActiveButtonBackground = new SolidColorBrush(Color.FromArgb(255, 37, 99, 235));  // #2563EB
        private static readonly SolidColorBrush ActiveButtonForeground = new SolidColorBrush(Color.FromArgb(255, 255, 255, 255)); // White

        public AIChatUserControl()
        {
            InitializeComponent();
            App = Globals.ThisAddIn.Application; // 创建 Excel 应用实例
            SettingsButton = new Button(); // 初始化设置按钮

            // 设置默认存储路径
            InitializeVbaCodeFilePath();

            InitializeWebView2(); // 初始化 WebView2 控件
            LoadVbaCodes(); // 加载VBA代码

            // 设置 ComboBox 的默认选中项为 "DeepSeek"
            webPageComboBox.SelectedIndex = 0;

            filePathTextBox.Text = vbaCodeFilePath;

            // 在窗体加载时自动加载网页
            this.Loaded += AIChatUserControl_Loaded;
            vbaCodeComboBox.DataContext = this;

            // 监听 ComboBox 的相关事件来模拟 TextSubmitted
            vbaCodeComboBox.LostFocus += VbaCodeComboBox_LostFocus;
            vbaCodeComboBox.KeyDown += VbaCodeComboBox_KeyDown;

            // 设置默认选中项
            SetDefaultComboBoxSelection();
        }

        // 初始化VBA代码文件路径
        private void InitializeVbaCodeFilePath()
        {
            if (string.IsNullOrEmpty(Settings.Default.vbaCodeFilePath))
            {
                string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
                vbaCodeFilePath = Path.Combine(appDataPath, DefaultVbaFileName);
                Settings.Default.vbaCodeFilePath = vbaCodeFilePath;
                Settings.Default.Save();
            }
            else
            {
                vbaCodeFilePath = Settings.Default.vbaCodeFilePath;
            }
        }

        // 设置默认的ComboBox选中项
        private void SetDefaultComboBoxSelection()
        {
            if (vbaCodeComboBox.SelectedItem == null)
            {
                webPageComboBox.SelectedIndex = 0;
            }
            if (vbaCodeComboBox.SelectedItem == null && vbaCodeComboBox.Items.Count > 0)
            {
                vbaCodeComboBox.SelectedIndex = 0;
            }
        }

        // 选择文件路径的按钮点击事件
        private void SelectFilePathButton_Click(object sender, RoutedEventArgs e)
        {
            using (FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog())
            {
                DialogResult result = folderBrowserDialog.ShowDialog();
                if (result == System.Windows.Forms.DialogResult.OK)
                {
                    string newFilePath = Path.Combine(folderBrowserDialog.SelectedPath, DefaultVbaFileName);
                    MoveVbaCodeFile(newFilePath);
                }
            }
        }

        // 移动VBA代码文件到新路径
        private void MoveVbaCodeFile(string newFilePath)
        {
            if (File.Exists(vbaCodeFilePath))
            {
                try
                {
                    // 转移文件到新路径
                    File.Move(vbaCodeFilePath, newFilePath);
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"转移文件时出错: {ex.Message}");
                    return;
                }
            }
            vbaCodeFilePath = newFilePath;
            filePathTextBox.Text = vbaCodeFilePath;
            Settings.Default.vbaCodeFilePath = newFilePath;
            Settings.Default.Save();
        }

        private void AIChatUserControl_Loaded(object sender, RoutedEventArgs e)
        {
            // 触发 ComboBox 的 SelectionChanged 事件，以加载默认网页
            WebPageComboBox_SelectionChanged(webPageComboBox, null);
        }

        // 非激活状态下重置按钮样式
        private void ResetButtonStyles()
        {
            aiChatButton.Background = DefaultButtonBackground;
            codeBoxButton.Background = DefaultButtonBackground;
            aiChatButton.Foreground = DefaultButtonForeground;
            codeBoxButton.Foreground = DefaultButtonForeground;
        }

        // 设置按钮处于激活状态
        private void SetButtonActive(Button button)
        {
            ResetButtonStyles();
            button.Background = ActiveButtonBackground;
            button.Foreground = ActiveButtonForeground;
        }

        public void SetIsInPopOutWindow(bool value)
        {
            IsInPopOutWindow = value;
        }

        private void PopupButton_Click(object sender, RoutedEventArgs e)
        {
            if (IsInPopOutWindow)
            {
                PopBackRequested?.Invoke(this, EventArgs.Empty);
            }
            else
            {
                PopOutRequested?.Invoke(this, EventArgs.Empty);
            }
        }

        // 加载VBA代码
        private void LoadVbaCodes()
        {
            if (File.Exists(vbaCodeFilePath))
            {
                string json = File.ReadAllText(vbaCodeFilePath);
                vbaCodeItems = JsonConvert.DeserializeObject<List<VbaCodeItem>>(json);

                // 根据每个代码项的代码生成标题
                foreach (var item in vbaCodeItems)
                {
                    item.SetTitleFromCode(); // 自动从代码中生成标题
                }

                vbaCodeComboBox.ItemsSource = vbaCodeItems;
                vbaCodeComboBox.DisplayMemberPath = "Title";
            }
        }

        // 保存VBA代码
        private void SaveVbaCodes()
        {
            string json = JsonConvert.SerializeObject(vbaCodeItems);
            File.WriteAllText(vbaCodeFilePath, json);
        }

        // AI对话按钮点击事件
        private void AiChatButton_Click(object sender, RoutedEventArgs e)
        {
            windowsFormsHost.Visibility = Visibility.Visible;
            codeBoxGrid.Visibility = Visibility.Collapsed;
            SetButtonActive(aiChatButton);
        }

        // 代码盒子按钮点击事件
        private void CodeBoxButton_Click(object sender, RoutedEventArgs e)
        {
            windowsFormsHost.Visibility = Visibility.Collapsed;
            codeBoxGrid.Visibility = Visibility.Visible;
            SetButtonActive(codeBoxButton);
        }

        private async void InitializeWebView2()
        {
            // 创建 WebView2 控件
            webView = CreateWebView();

            // 创建 WindowsFormsHost 控件来嵌入 WebView2
            WindowsFormsHost host = CreateWindowsFormsHost(webView);

            // 将 WindowsFormsHost 添加到 WPF 窗体的布局中
            windowsFormsHost.Child = webView;

            // 指定 WebView2 数据目录
            var env = await CreateWebView2Environment();
            await webView.EnsureCoreWebView2Async(env);

            // 初始化完成后，加载默认网页
            webView.CoreWebView2.Navigate(DefaultWebPageUrl);

            // 监听页面加载完成，确保页面加载完再注入 JavaScript
            webView.CoreWebView2.NavigationCompleted += async (sender, e) =>
            {
                try
                {
                    string currentUrl = webView.CoreWebView2.Source.ToString();
                    string jsFilePath = GetJavaScriptFilePath(currentUrl);
                    string jsCode = File.ReadAllText(jsFilePath);
                    await webView.CoreWebView2.ExecuteScriptAsync(jsCode);
                }
                catch (Exception ex)
                {
                    MessageBox.Show($"加载 JavaScript 脚本时出错: {ex.Message}");
                }
            };

            // 监听来自 Web 页的消息并执行 VBA 代码
            webView.CoreWebView2.WebMessageReceived += CoreWebView2_WebMessageReceived;

            // 监听页面跳转请求，拦截并在当前 WebView2 控件中打开链接
            webView.CoreWebView2.NewWindowRequested += CoreWebView2_NewWindowRequested;
        }

        // 创建WebView2控件
        private WebView2 CreateWebView()
        {
            return new WebView2
            {
                Dock = System.Windows.Forms.DockStyle.Fill
            };
        }

        // 创建WindowsFormsHost控件
        private WindowsFormsHost CreateWindowsFormsHost(WebView2 webView)
        {
            return new WindowsFormsHost
            {
                Child = webView
            };
        }

        // 创建WebView2环境
        private async System.Threading.Tasks.Task<CoreWebView2Environment> CreateWebView2Environment()
        {
            return await CoreWebView2Environment.CreateAsync(null, Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), WebView2DataFolder, "WebView2Data"));
        }
      

        // 根据URL获取JavaScript文件路径
        private string GetJavaScriptFilePath(string currentUrl)
        {
            string jsFilePath;
            if (currentUrl.Contains("deepseek.com"))
            {
                jsFilePath = ExtractEmbeddedResource("QMagicBoxExcel.JavaScript.DeepSeek.js");
               
            }
            else if (currentUrl.Contains("kimi.moonshot.cn"))
            {
                jsFilePath = ExtractEmbeddedResource("QMagicBoxExcel.JavaScript.kimi.js");
             

            }
            else if (currentUrl.Contains("tongyi.aliyun.com"))
            {
                jsFilePath = ExtractEmbeddedResource("QMagicBoxExcel.JavaScript.TongYiQianWen.js");

            }
            else if (currentUrl.Contains("doubao.com"))
            {
                jsFilePath = ExtractEmbeddedResource("QMagicBoxExcel.JavaScript.DouBao.js");
            }
            else if (currentUrl.Contains("jimeng.jianying.com"))
            {
                jsFilePath = ExtractEmbeddedResource("QMagicBoxExcel.JavaScript.CatchPicture.js");
            }
            else if (currentUrl.Contains("chat.qwenlm.ai"))
            {
                jsFilePath = ExtractEmbeddedResource("QMagicBoxExcel.JavaScript.QwenChat.js");
            }
            else if (currentUrl.Contains("wenxiaobai.com"))
            {
                jsFilePath = ExtractEmbeddedResource("QMagicBoxExcel.JavaScript.WenXiaoBai.js");
            }
            else
            {
                // 其他网页加载通用脚本（但不能确保其他所有网页都生效）
                jsFilePath = ExtractEmbeddedResource("QMagicBoxExcel.JavaScript.TongYong.js");
            }
            return jsFilePath;
        }
      

        // 监听和解析网页数据
        private void CoreWebView2_WebMessageReceived(object sender, CoreWebView2WebMessageReceivedEventArgs e)
        {
            string rawMessage = e.WebMessageAsJson;
            string message = rawMessage.Trim('\"'); // 去除外层的双引号
            dynamic data = null;

            try
            {
                // 解析 JSON 字符串
                data = Newtonsoft.Json.JsonConvert.DeserializeObject(message);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"解析消息时出错: {ex.Message}");
                return;
            }

            // 处理不同类型的消息
            HandleWebMessage(data);
        }

        // 扩展 HandleWebMessage 方法，处理上传工作簿的消息
        private void HandleWebMessage(dynamic data)
        {
            if (data != null)
            {
                string messageType = data.type.ToString();

                switch (messageType)
                {
                    case "getSelection":
                        HandleGetExcelSelectionMessage();
                        break;
                    case "exportText":
                        string markdownText = data.text.ToString();
                        ExportTextToExcelCell(markdownText);
                        break;
                    case "runVBA":
                        string vbaCode = Uri.UnescapeDataString(data.code.ToString());
                        Console.WriteLine($"Running VBA code: {vbaCode}");
                        RunVbaCode(vbaCode);
                        break;
                    case "favoriteVBA":
                        string favoriteCode = data.code.ToString();
                        AddFavoriteVbaCode(favoriteCode);
                        break;
                    case "uploadWorkbook":
                        UploadCurrentWorkbook();
                        break;                  
                    case "uploadError":
                        string errorMessage = data.message.ToString();
                        ShowUploadError(errorMessage);
                        break;
                    default:
                        Console.WriteLine($"未知消息类型: {messageType}");
                        break;
                }
            }
        }


        // 上传当前活动工作簿的方法
        private async void UploadCurrentWorkbook()
        {
            try
            {
                // 获取当前活动的Excel应用程序
                Microsoft.Office.Interop.Excel.Application excelApp = Globals.ThisAddIn.Application;

                // 获取当前活动的工作簿
                Workbook activeWorkbook = excelApp.ActiveWorkbook;

                if (activeWorkbook == null)
                {
                    MessageBox.Show("没有打开的工作簿！", "上传错误", MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }

                // 检查工作簿是否已保存
                if (string.IsNullOrEmpty(activeWorkbook.Path))
                {
                    // 如果工作簿未保存，询问用户是否要先保存
                    MessageBoxResult saveResult = MessageBox.Show(
                        "工作簿尚未保存。要继续上传，需要先保存文件。\n是否立即保存？",
                        "保存文件",
                        MessageBoxButton.YesNo,
                        MessageBoxImage.Question);

                    if (saveResult == MessageBoxResult.Yes)
                    {
                        // 调用Excel的保存对话框
                        activeWorkbook.Save();

                        // 再次检查是否已保存
                        if (string.IsNullOrEmpty(activeWorkbook.Path))
                        {
                            MessageBox.Show("文件未保存，无法继续上传。", "上传取消", MessageBoxButton.OK, MessageBoxImage.Information);
                            return;
                        }
                    }
                    else
                    {
                        MessageBox.Show("文件未保存，无法继续上传。", "上传取消", MessageBoxButton.OK, MessageBoxImage.Information);
                        return;
                    }
                }

                // 获取工作簿的完整路径
                string workbookPath = activeWorkbook.FullName;
                string fileName = Path.GetFileName(workbookPath);

                
                // 确认上传
                MessageBoxResult result = MessageBox.Show(
                    $"确认上传当前文件吗？\n\n{fileName}",
                    "确认上传",
                    MessageBoxButton.YesNo,
                    MessageBoxImage.Question);

                if (result == MessageBoxResult.Yes)
                {
                    // 创建临时文件路径
                    string tempFilePath = Path.Combine(Path.GetTempPath(), fileName);

                    // 复制文件到临时路径
                    File.Copy(workbookPath, tempFilePath, true);

                    try
                    {
                        // 读取临时文件内容
                        byte[] fileContent = File.ReadAllBytes(tempFilePath);
                        string base64Content = Convert.ToBase64String(fileContent);
                        string fileType = GetMimeTypeFromExtension(Path.GetExtension(workbookPath));

                        // 调用JavaScript函数进行直接上传
                        await DirectUploadFileWithJavaScript(base64Content, fileName, fileType);
                    }
                    finally
                    {
                        // 删除临时文件
                        if (File.Exists(tempFilePath))
                        {
                            File.Delete(tempFilePath);
                        }
                    }
                }
                else
                {
                    //
                }
            }
            catch (Exception ex)
            {
                
                MessageBox.Show($"上传工作簿时出错: {ex.Message}", "上传错误", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        // 根据文件扩展名获取MIME类型
        private string GetMimeTypeFromExtension(string extension)
        {
            switch (extension.ToLower())
            {
                case ".xlsx":
                    return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                case ".xls":
                    return "application/vnd.ms-excel";
                case ".csv":
                    return "text/csv";
                default:
                    return "application/octet-stream";
            }
        }

        // 直接通过JavaScript上传文件
        private async Task DirectUploadFileWithJavaScript(string base64Content, string fileName, string fileType)
        {
            try
            {
                // 调用JavaScript的上传函数
                string script = $"window.directUploadExcelFile('{base64Content}', '{fileName}', '{fileType}');";
                await webView.CoreWebView2.ExecuteScriptAsync(script);
            }
            catch (Exception ex)
            {
                
                MessageBox.Show($"通过JavaScript上传文件时出错: {ex.Message}", "上传错误", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

      

        private void ShowUploadError(string errorMessage)
        {
          
            MessageBox.Show($"上传文件时出错: {errorMessage}", "上传错误", MessageBoxButton.OK, MessageBoxImage.Error);
        }

      

        // 触发网页中的文件上传
        private void TriggerFileUploadInBrowser(string filePath)
        {
            try
            {
                // 准备JavaScript脚本，触发文件上传控件点击
                string script = @"
                (function() {
                    // 找到文件上传控件
                    const fileInput = document.querySelector('input[type=""file""]');
                    if (fileInput) {
                        // 创建自定义事件，准备Excel工作簿路径
                        const excelUploadEvent = new CustomEvent('excelUpload', {
                            detail: { filePath: '" + filePath.Replace("\\", "\\\\") + @"' }
                        });
                        
                        // 分发事件
                        document.dispatchEvent(excelUploadEvent);
                        
                        // 通知C#后端已找到上传控件
                        window.chrome.webview.postMessage({
                            type: 'uploadControlFound',
                            status: 'success'
                        });
                        
                        // 模拟点击文件上传控件
                        fileInput.click();
                        
                        // 监听文件选择变化
                        fileInput.addEventListener('change', function() {
                            if (this.files.length > 0) {
                                window.chrome.webview.postMessage({
                                    type: 'fileUploadStarted',
                                    fileName: this.files[0].name
                                });
                            }
                        }, { once: true });
                        
                        return true;
                    } else {
                        // 通知C#后端未找到上传控件
                        window.chrome.webview.postMessage({
                            type: 'uploadControlFound',
                            status: 'error',
                            message: '未找到文件上传控件'
                        });
                        return false;
                    }
                })();";

                // 执行JavaScript
                webView.CoreWebView2.ExecuteScriptAsync(script).ContinueWith(t =>
                {
                    // 脚本执行完成后的处理
                    string result = t.Result;
                    if (result == "true")
                    {
                        // 成功找到上传控件，等待用户选择文件
                        Console.WriteLine("成功找到上传控件，等待用户操作");
                    }
                    else
                    {
                      
                    }
                });
            }
            catch (Exception ex)
            {
                
                MessageBox.Show($"触发文件上传时出错: {ex.Message}", "上传错误", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }


        // 处理getExcelSelection消息
        private void HandleGetExcelSelectionMessage()
        {
            Console.WriteLine("收到 getExcelSelection 消息");
            string selectedText = GetExcelSelectionText();
            Console.WriteLine("获取到的Excel选择范围数据: " + selectedText);

            string jsonResponse = Newtonsoft.Json.JsonConvert.SerializeObject(new
            {
                type = "excelSelection",
                text = selectedText
            });

            webView.CoreWebView2.PostWebMessageAsJson(jsonResponse);
        }

        // 添加收藏的VBA代码
        private void AddFavoriteVbaCode(string vbaCode)
        {
            VbaCodeItem newItem = new VbaCodeItem { Code = vbaCode };
            newItem.SetTitleFromCode(); // 确保 Title 属性已经正确设置
            vbaCodeItems.Add(newItem);
            vbaCodeComboBox.ItemsSource = null;
            vbaCodeComboBox.ItemsSource = vbaCodeItems;
            vbaCodeComboBox.DisplayMemberPath = "Title";
            SaveVbaCodes();

            // 设置 ComboBox 的选中项为新添加的代码项
            vbaCodeComboBox.SelectedItem = newItem;
        }

        // 获取当前Excel选择范围内的文本（这里也可以对获取文本进行格式化）
        private string GetExcelSelectionText()
        {
            try
            {
                // 获取当前活动的 Excel 选择范围
                var selection = App.Selection;

                if (selection == null)
                {
                    MessageBox.Show("未找到有效的选择范围");
                    return string.Empty;
                }

                // 获取选择范围的行数和列数
                int rowCount = selection.Rows.Count;
                int colCount = selection.Columns.Count;

                // 获取选择范围的地址
                string address = selection.Address[false, false];

                // 用于存储所有单元格数据的字符串
                StringBuilder selectedText = new StringBuilder();

                // 添加固定标题和选择范围地址
                selectedText.AppendLine($"引用Excel数据（范围：{address}）：");
                selectedText.AppendLine("<引用开始>");

                // 遍历选择范围内的所有单元格
                for (int i = 1; i <= rowCount; i++)
                {
                    for (int j = 1; j <= colCount; j++)
                    {
                        // 获取当前单元格的值
                        var cellValue = selection.Cells[i, j].Text.ToString();

                        // 将单元格值添加到字符串中
                        selectedText.Append(cellValue);

                        // 如果不是最后一列，添加分隔符（例如制表符）
                        if (j < colCount)
                        {
                            selectedText.Append("\t"); // 使用制表符分隔单元格
                        }
                    }

                    // 如果不是最后一行，添加换行符
                    if (i < rowCount)
                    {
                        selectedText.AppendLine(); // 换行
                    }
                }
                selectedText.AppendLine(); // 保留一个空行
                // 添加分割线和空行
                selectedText.AppendLine("</引用结束>");
                selectedText.AppendLine("【代码任务】帮我在当前活动工作簿中写一段VBA代码（仅返回代码无需其余描述）：");
                selectedText.AppendLine(); // 保留一个空行

                return selectedText.ToString();
            }
            catch (Exception ex)
            {
                MessageBox.Show($"获取Excel选择范围时出错: {ex.Message}");
                return string.Empty;
            }
        }

        // 将文本导出到当前活动的 Excel 单元格
        private void ExportTextToExcelCell(string text)
        {
            try
            {
                // 获取当前活动的 Excel 单元格
                var cell = App.ActiveCell;

                // 在单元格中插入文本
                cell.Value = text;
            }
            catch (Exception ex)
            {
                MessageBox.Show($"导出文本到 Excel 时出错: {ex.Message}");
            }
        }

        // 从剪切板获取 VBA 代码，并调用 RunVbaCode 方法运行 VBA（需判断是否是 VBA 代码）
        private void RunVbaFromClipboard_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                // 从剪切板获取文本
                string clipboardText = System.Windows.Clipboard.GetText();

                // 判断是否是有效的 VBA 代码
                if (IsVBACode(clipboardText))
                {
                    // 运行 VBA 代码
                    RunVbaCode(clipboardText);
                }
                else
                {
                    MessageBox.Show("剪切板内容不是有效的 VBA 代码！");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"从剪切板获取 VBA 代码时出错: {ex.Message}");
            }
        }

        // 运行 VBA 按钮点击事件
        private void RunVbaButton_Click(object sender, RoutedEventArgs e)
        {
            var selectedItem = vbaCodeComboBox.SelectedItem as VbaCodeItem;
            if (selectedItem != null)
            {
                RunVbaCode(selectedItem.Code);
            }
        }

        // 删除 VBA 代码项按钮点击事件
        private void DeleteVbaButton_Click(object sender, RoutedEventArgs e)
        {
            var selectedItem = vbaCodeComboBox.SelectedItem as VbaCodeItem;
            if (selectedItem != null)
            {
                // 从代码列表中移除该项
                vbaCodeItems.Remove(selectedItem);

                // 更新 ItemsSource 显示
                vbaCodeComboBox.ItemsSource = null;
                vbaCodeComboBox.ItemsSource = vbaCodeItems;

                // 保存最新的 VBA 代码数据
                SaveVbaCodes();

                // 清空文本框
                vbaCodeTextBox.Text = "";

                // 检查 vbaCodeItems 是否还有元素
                if (vbaCodeItems.Count > 0)
                {
                    // 将 ComboBox 的选中项设置为第一个元素
                    vbaCodeComboBox.SelectedIndex = 0;
                }
            }
        }

        // 运行 VBA 代码
        private void RunVbaCode(string vbaCode)
        {
            VBComponent vbaModule = null;
            try
            {
                // 获取当前 Excel 工作簿
                var workbook = App.ActiveWorkbook;

                // 创建一个新的 VBA 模块
                vbaModule = workbook.VBProject.VBComponents.Add(Microsoft.Vbe.Interop.vbext_ComponentType.vbext_ct_StdModule);
                vbaModule.CodeModule.AddFromString(vbaCode); // 将 VBA 代码插入到模块中

                // 提取 VBA 代码中的第一个 Sub 方法名
                string methodName = GetFirstSubMethodName(vbaCode);

                if (string.IsNullOrEmpty(methodName))
                {
                    MessageBox.Show("VBA 代码中没有找到有效的 Sub 方法名！");
                    return;
                }

                // 运行指定的 VBA 方法
                App.Run(methodName); // 使用传递的 methodName 执行该 Sub 方法

                // 移除 VBA 模块
                workbook.VBProject.VBComponents.Remove(vbaModule);
                vbaModule = null; // 设置 vbaModule 为 null
            }
            catch (Exception ex)
            {
                MessageBox.Show($"运行 VBA 代码时出错: {ex.Message}");
            }
            finally
            {
                // 移除 VBA 模块
                if (vbaModule != null)
                {
                    App.ActiveWorkbook.VBProject.VBComponents.Remove(vbaModule);
                }
            }
        }

        // 从 VBA 代码中提取第一个 Sub 方法名
        private string GetFirstSubMethodName(string vbaCode)
        {
            // 正则表达式匹配 Sub 方法的名字
            var match = Regex.Match(vbaCode, @"^\s*Sub\s+(\w+)\s*.*", RegexOptions.IgnoreCase);

            if (match.Success)
            {
                return match.Groups[1].Value; // 返回方法名
            }
            return null; // 没有找到方法名
        }

        // 检查是否是有效的 VBA 代码
        private static bool IsVBACode(string code)
        {
            // 去除注释
            code = Regex.Replace(code, @"'.*$", "", RegexOptions.Multiline | RegexOptions.IgnoreCase);

            // 匹配 Sub 或 Function 块
            string pattern = @"^\s*(Sub|Function)\b[\s\S]*?(End (Sub|Function))\s*$";
            return Regex.IsMatch(code, pattern, RegexOptions.IgnoreCase);
        }

        // 提取嵌入资源文件
        private string ExtractEmbeddedResource(string resourceName)
        {
            string tempFile = Path.Combine(Path.GetTempPath(), resourceName.Replace('.', Path.DirectorySeparatorChar));
            string directory = Path.GetDirectoryName(tempFile);
            if (!Directory.Exists(directory))
            {
                Directory.CreateDirectory(directory);
            }
            using (var resource = typeof(AIChatUserControl).Assembly.GetManifestResourceStream(resourceName))
            {
                if (resource == null)
                    throw new FileNotFoundException($"Resource {resourceName} not found.");
                using (var file = new FileStream(tempFile, FileMode.Create, FileAccess.Write))
                {
                    resource.CopyTo(file);
                }
            }
            return tempFile;
        }

        // 拦截新窗口请求，防止打开新窗口
        private void CoreWebView2_NewWindowRequested(object sender, CoreWebView2NewWindowRequestedEventArgs e)
        {
            // 阻止默认行为，并在当前窗口中加载新的 URL
            e.Handled = true;
            webView.CoreWebView2.Navigate(e.Uri.ToString());
        }

        private void WebPageComboBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            // 获取选中的项
            var selectedItem = webPageComboBox.SelectedItem as ComboBoxItem;
            if (selectedItem != null)
            {
                string selectedPage = selectedItem.Content.ToString();
                // 根据选择的内容设置对应的网址
                string url = GetWebPageUrl(selectedPage);

                // 检查 CoreWebView2 是否已初始化
                if (webView != null && webView.CoreWebView2 != null)
                {
                    // 使用 WebView2 加载对应的网址
                    webView.CoreWebView2.Navigate(url);
                }
                else
                {
                    // MessageBox.Show("网页初始化中...");
                }
            }
        }

        // 根据选择的网页名称获取对应的 URL
        private string GetWebPageUrl(string selectedPage)
        {
            switch (selectedPage)
            {
                case "DeepSeek":
                    return "https://www.deepseek.com";
                case "通义千问":
                    return "https://tongyi.aliyun.com";
                case "QwenChat":
                    return "https://chat.qwenlm.ai";
                case "豆包":
                    return "https://www.doubao.com";
                case "Kimi":
                    return "https://kimi.moonshot.cn";
                case "灵犀助手":
                    return "https://lingxi.wps.cn";
                case "问小白":
                    return "https://www.wenxiaobai.com";
                case "跃问AI":
                    return "https://yuewen.cn/chats/new";
                case "当贝AI":
                    return "https://ai.dangbei.com/chat";
                case "硅基流动":
                    return "https://cloud.siliconflow.cn";
                case "超算平台":
                    return "https://chat.scnet.cn";
                case "腾讯元宝":
                    return "https://yuanbao.tencent.com";
                default:
                    return DefaultWebPageUrl; // 默认值
            }
        }

        // VBA 代码项类
        public class VbaCodeItem : INotifyPropertyChanged
        {
            private string _title;
            public string Title
            {
                get { return _title; }
                set
                {
                    if (_title != value)
                    {
                        _title = value;
                        OnPropertyChanged(nameof(Title));
                    }
                }
            }

            public string Code { get; set; }

            // 自动从 VBA 代码中提取第一个 Sub 方法名作为标题
            public void SetTitleFromCode()
            {
                this.Title = GetFirstSubMethodName(Code);
            }

            // 提取 VBA 代码中的第一个 Sub 方法名
            private string GetFirstSubMethodName(string vbaCode)
            {
                var match = Regex.Match(vbaCode, @"^\s*Sub\s+(\w+)\s*.*", RegexOptions.IgnoreCase);
                return match.Success ? match.Groups[1].Value : "Unnamed Sub"; // 如果没有找到 Sub 方法，默认给一个名字
            }

            public event PropertyChangedEventHandler PropertyChanged;
            protected virtual void OnPropertyChanged(string propertyName)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        // VBA 代码 ComboBox 选择改变事件
        private void VbaCodeComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var selectedItem = vbaCodeComboBox.SelectedItem as VbaCodeItem;
            if (selectedItem != null)
            {
                vbaCodeTextBox.Text = selectedItem.Code;
                vbaCodeComboBox.Text = selectedItem.Title; // 确保选择项后更新 ComboBox 的显示文本
                Debug.WriteLine($"Selected item title: {selectedItem.Title}");
            }
            else
            {
                Debug.WriteLine("Selected item is null.");
            }
        }

        // 处理 ComboBox 失去焦点事件
        private void VbaCodeComboBox_LostFocus(object sender, RoutedEventArgs e)
        {
            SaveComboBoxTitle();
        }

        // 处理 ComboBox 按键按下事件
        private void VbaCodeComboBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                SaveComboBoxTitle();
            }
        }

        // 保存 ComboBox 中编辑的标题
        private void SaveComboBoxTitle()
        {
            var selectedItem = vbaCodeComboBox.SelectedItem as VbaCodeItem;
            if (selectedItem != null)
            {
                // 更新选中项的标题
                selectedItem.Title = vbaCodeComboBox.Text;
                // 保存修改后的 VBA 代码数据
                SaveVbaCodes();
            }
        }

        // 保存 VBA 代码按钮点击事件
        private void SaveVbaCodeButton_Click(object sender, RoutedEventArgs e)
        {
            var selectedItem = vbaCodeComboBox.SelectedItem as VbaCodeItem;
            if (selectedItem != null)
            {
                // 更新代码
                selectedItem.Code = vbaCodeTextBox.Text;

                // 更新标题
                selectedItem.SetTitleFromCode();
                // 保存修改后的 VBA 代码数据
                SaveVbaCodes();
                // 更新 ComboBox 显示
                vbaCodeComboBox.ItemsSource = null;
                vbaCodeComboBox.ItemsSource = vbaCodeItems;
                vbaCodeComboBox.SelectedItem = selectedItem; // 确保选中修改后的项
            }
        }

        private void SettingsButton_Click(object sender, RoutedEventArgs e)
        {
            pathPopup.IsOpen = !pathPopup.IsOpen;
        }
    }
}